#ifndef PARSER_H_
#define PARSER_H_

#include "ParsedData.h"
#include "Rule.h"
#include "parser/exceptions/InvalidDataException.h"
#include "util/exceptions/IOException.h"
#include "util/File.h"
#include <string>

namespace parser {

/*
 * Clase para parsear archivos a partir de una regla que le asigna al crearla.
 * Lee linea por linea y separa los datos con el separador que la regla le indique.
 */
class Parser {
public:
	/*
	 * Constructur, asigna la regla a usar para parsear el archivo.
	 */
	Parser(Rule* rule);
	/*
	 * Destructor, cierra el archivo.
	 */
	virtual ~Parser();
	/*
	 * Setea el nombre del siguiente archivo a parsear.
	 */
	virtual Parser* setFileName(std::string fileName);
	/*
	 * Procesa la siguiente linea del archivo.
	 * Devuelve IOException en caso de no poder leer el archivo.
	 * Devuelve InvalidDataException en caso de leer informacion
	 * erronea.
	 */
	virtual ParsedData* processNextLine() throw (util::IOException,
			InvalidDataException);
	/*
	 * Chequea si se llego al final del archivo.
	 * Devuelve IOException en caso de no poder acceder al archivo.
	 */
	virtual bool noMoreDataInFile() throw (util::IOException);

	/*
	 * Devuelve el nombre del archivo que se esta parseando.
	 */
	virtual std::string getFileName();

	/*
	 * Devuelve el numero de linea que esta siendo parseada.
	 */
	virtual std::string getStrLineNumber();
private:
	util::File* file;
	Rule* rule;
	virtual void addValueToRule(std::string value) throw (InvalidDataException);
};
}

#endif /* PARSER_H_ */
